import 'package:flutter/material.dart';

/// 空安全检查，需要我们自己去指明每个字段的角色，是否可以为空
/// ?  可null
/// late 延迟加载
/// 默认值，主动
class CommonModel {
  List? names;
  // List names = []; //定义时初始化
  List colors; //在构造方法中初始化
  //开发习惯，遵循与java的开发习惯
  //默认有一个检查习惯，这字段，如果未加载，使用出错
  late List urls; //延时初始化
  // List? urls; //可空字段
  CommonModel(this.colors);

  void dispaly() {
    // if(names != null){
    //   names.length
    // }
    print(names?.length);
    print(colors);
    urls = [];
    print(urls);
  }
}

/// 对于自定的Widget无论是页面的某控件还是整个页面，
/// 通常都会为Widget定义一些属性。在进行空安全适配时要对属性进行一下分类：
class WebView extends StatefulWidget {
  String? url;

  /// 可空的属性：通过?进行修饰
  final String? statusBarColor;
  final String? title;
  final bool? hideAppBar;

  /// 不可空的属性：在构造函数中设置默认值或者通过required进行修饰
  final bool backForbid;

  WebView(
      {Key? key,
      this.url,
      this.statusBarColor,
      this.title,
      this.hideAppBar,
      this.backForbid = false})
      : super(key: key);

  State<WebView> createState() => WebViewState();
}

/// State的空安全适配主要是根据它的成员变量是否可空进行分类：
///可空的变量：通过?进行修饰
///不可空的变量：可采用以下两种方式进行适配
class WebViewState extends State<WebView> with TickerProviderStateMixin {
  //动画控制，类似这种控制器
  late TabController _controller; //延时初始
  List<CommonModel> tabs = []; //定义时初始化

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _controller = TabController(length: 0, vsync: this);
  }

  @override
  Widget build(BuildContext context) {
    return const Placeholder();
  }
}

void main() {
  CommonModel(['a', 'b']).dispaly();
}
